<?php
namespace Home\Controller;
use Think\Controller;
use Think\Page;

class PayController extends Controller {

    //支付宝支付
    public function pay()
    {
        //商户订单号，商户网站订单系统中唯一订单号，必填
        $out_trade_no = I('post.order_number');
        //订单名称，必填
        $proName = '灯饰商品';
        //付款金额，必填
        $total_amount = I('post.total_amount');
        //商品描述，可空
        $body = '';//trim($_POST['WIDbody']);
        Vendor('Alipay.aop.AopClient');
        Vendor('Alipay.aop.request.AlipayTradeWapPayRequest');
        //请求
        $c = new \AopClient();
        $config = C('alipay');
        $c->appId = $config['app_id'];
        $c->rsaPrivateKey = $config['merchant_private_key'];
        $c->format = "json";
        $c->charset = "UTF-8";
        $c->signType = "RSA2";
        $c->alipayrsaPublicKey = $config['alipay_public_key'];
        $request = new \AlipayTradeWapPayRequest();
        $request->setReturnUrl($config['return_url']);
        $request->setNotifyUrl($config['notify_url']);
        $request->setBizContent("{" .
            "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," .
            "    \"subject\":\"$proName\"," .
            "    \"out_trade_no\":\"$out_trade_no\"," .
            "    \"total_amount\":$total_amount," .
            "    \"body\":\"$body\"" .
            "  }");
        $result = $c->pageExecute($request);
//        $model = M('c_house_order');
//        $data = array(
//            'product_name'=>$proName,
//            'order_num'=>$out_trade_no,
//            'total_amount'=>$total_amount,
//            'description'=>$body,
//            'user_id'=>1,
//            'add_time'=>NOW_TIME,
//            'up_time'=>NOW_TIME
//        );
//        $model->add($data);
        //输出
        echo $result;
    }

    public function notify_url(){
        Vendor('Alipay.pagepay/service/AlipayTradeService');
        $arr=$_POST;
        $config = C('alipay');
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];


            if($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序

                //查询订单状态及总额
                $status = M('order o')->field('o.order_status,cp.count_price')
                    ->join('__COUNT_PRICE__ cp on cp.order_number=o.order_number')
                    ->where('o.order_number='.$out_trade_no)
                    ->find();
                if($status['order_status'] != 1){ //没做处理
                    //判断订单总额是否一致
                    if($status['count_price'] == $_POST['total_amount']){
                        //修改订单状态
                        M('order')->where('order_number='.$out_trade_no)->save(array('order_status'=>1));

                        //增加商品销量
                        $order_list = M('order')->field('good_id,num')->where(array('order_number'=>$out_trade_no))->select();
                        foreach($order_list AS $k=>$v){
                            M('goods')->where(array('good_id'=>$v['good_id']))->setInc('sale',$v['num']);
                        }
                        
                        echo "success";		//请不要修改或删除
                    }
                }

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            }

        }else {
            //验证失败
            echo "fail";	//请不要修改或删除

        }
    }

    /**
     * 微信H5支付
     */
    public function wxpay(){
        $notify_url = "http://www.sx-dengshijie.com/index.php/Home/Pay/notify"; //异步通知地址
        $order_number = '12356484512';
        $money = '100';
        //调用微信支付函数
//        $url = wxpay($order_number,$money,$notify_url);
//        var_dump($url);

        //Vendor('Wxpay.example.WxPay#JsApiPay');
        Vendor('Wxpay.lib.WxPay#Api');
        Vendor('Wxpay.lib.WxPay#Data');
        Vendor('Wxpay.lib.WxPay#Config');
        Vendor('Wxpay.lib.WxPay#Exception');
        //$notify = new \JsApiPay();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody('订单号：'.$order_number);    //描述
        //$input->SetAttach("$test");  //设置附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
        $input->SetOut_trade_no($order_number);   //订单号
        $input->SetTotal_fee($money*100);       //单位为分，只能传整数
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 60));
        $input->SetNotify_url($notify_url);
        $input->SetTrade_type("MWEB");
        //$input->SetProduct_id("123456789");  //此id为二维码中包含的商品ID，商户自行定义
        //$result = $notify->GetJsApiParameters($input);
        $order = \WxPayApi::unifiedOrder($input);
        var_dump($order);
    }

    //支付成功后回调
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //返回的xml
        $xmlObj=simplexml_load_string($xml,'SimplexmlElement',LIBXML_NOCDATA);
        $xmlArr=json_decode(json_encode($xmlObj),true);
        $out_trade_no=$xmlArr['out_trade_no']; //订单号
        $total_fee=$xmlArr['total_fee']/100; //回调回来的xml文件中金额是以分为单位的
        $result_code=$xmlArr['result_code']; //状态
        if($result_code=='SUCCESS'){ //数据库操作
            $status = M('order o')->field('o.order_status,cp.count_price')
                ->join('__COUNT_PRICE__ cp on cp.order_number=o.order_number')
                ->where('o.order_number='.$out_trade_no)
                ->find();
            if($status['order_status'] != 1){ //没做处理
                //判断订单总额是否一致
                if($status['count_price'] == $total_fee){
                    //修改订单状态
                    $data['order_status'] = 1;
                    $data['pay_time'] = date('Y-m-d H:i:s');
                    M('order')->where('order_number='.$out_trade_no)->save($data);

                    //增加商品销量
                    $order_list = M('order')->field('good_id,num')->where(array('order_number'=>$out_trade_no))->select();
                    foreach($order_list AS $k=>$v){
                        M('goods')->where(array('good_id'=>$v['good_id']))->setInc('sale',$v['num']);
                    }

                    echo 'SUCCESS'; //返回成功给微信端
                }
            }
        }else{ //失败
            echo 'FAIL';
            exit;
        }
    }

    /**
     * jsapi支付
     */
    public function wxjspay(){
        $notify_url = "http://www.sx-dengshijie.com/ThinkPHP/Library/Vender/Wxpay/example/notify.php"; //异步通知地址
        $order_number = I('order_number');
        $money = I('orderPrice');
        //调用微信支付函数
        Vendor('Wxpay.example.WxPay#JsApiPay');
        Vendor('Wxpay.lib.WxPay#Api');
        Vendor('Wxpay.lib.WxPay#Data');
        Vendor('Wxpay.lib.WxPay#Config');
        Vendor('Wxpay.lib.WxPay#Exception');
        $notify = new \JsApiPay();
        $openid = $notify->GetOpenid();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody('订单号：'.$order_number);    //描述
        $input->SetOut_trade_no($order_number);   //订单号
        $input->SetTotal_fee($money*100);       //单位为分，只能传整数
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 60));
        $input->SetNotify_url($notify_url);
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openid);
        $order = \WxPayApi::unifiedOrder($input);
        if($order['err_code'] == 'INVALID_REQUEST'){
            $this->error('该订单已过期，请重新下单');
        }
        $jsApiParameters = $notify->GetJsApiParameters($order);
        $this->assign('money',$money);
        $this->assign('order_number',$order_number);
        $this->assign('jsApiParameters',$jsApiParameters);
        $this->display();
    }

    //查询微信支付状态
    public function orderquery(){
        ini_set('date.timezone','Asia/Shanghai');
        error_reporting(E_ERROR);
        Vendor('Wxpay.lib.WxPay#Api');
        Vendor('Wxpay.lib.WxPay#Data');
        Vendor('Wxpay.lib.WxPay#Config');
        Vendor('Wxpay.example.log');

        //初始化日志
        $logHandler= new \CLogFileHandler("./logs/".date('Y-m-d').'.log');
        $log = \Log::Init($logHandler, 15);

        if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
            $out_trade_no = $_REQUEST["out_trade_no"];
            $input = new \WxPayOrderQuery();
            $input->SetOut_trade_no($out_trade_no);
            $rult = \WxPayApi::orderQuery($input);

            if($rult['trade_state'] == 'SUCCESS'){
                //支付成功
                echo 1;
            }elseif ($rult['trade_state'] == 'NOTPAY'){
                //未支付
                echo 2;
            }elseif ($rult['trade_state'] == 'CLOSED'){
                //已关闭
                echo 3;
            }elseif ($rult['trade_state'] == 'USERPAYING'){
                //用户支付中
                echo 4;
            }elseif ($rult['trade_state'] == 'PAYERROR'){
                //支付失败
                echo 5;
            }
        }
    }
}